package com.vvv.designpattern.structualpatterns;

/**
 * @author vvv
 * @date 2023-11-13 15 01
 * discription 建造者模式
 * 建造者模式，属于创建型模式。将一个复杂的构建与其表示相分离
 * ，使得同样的构建过程可以创建不同的表示。 （听起来好像不是人话，后面结合实例才好理解！）
 */
public class Builder01 {
    public static void main(String[] args) {
        /**
         * 假如我们有一个类，他有非常多的成员变量，
         * 其中，有默认值的不需要赋值，没有默认值的需要赋值。
         * 1. 我们可以用构造器去构造，但是这样构造器的参数就会很多，可读性不行 X
         * 2. 我们可以用setter的方式去构造，但是这样我们就无法知道那些参数是要赋值的那些不要 X
         * 3. 我们可以用 建造者模式 + 连锁调用解决
         */
        Config config = new Config.Builder()
                .age(18)
                .name("vvv")
                .sex(1)
                .build();
        System.out.println(config);
    }
}
class Config {
    private static final int DEFAULT_TOTAL = 8;
    private static final int DEFAULT_MAX = 8;
    private static final int DEFAULT_MIN = 0;

    private int maxTotal = DEFAULT_TOTAL;
    private int maxIdle = DEFAULT_MAX;
    private int minIdle = DEFAULT_MIN;

    private String name;

    private Integer age;

    private Integer sex;

    private Config(Builder builder) {
        this.name = builder.name;
        this.age = builder.age;
        this.sex = builder.sex;
    }


    public static class Builder {
        private String name;

        private Integer age;

        private Integer sex;

        public Config build() {
            return new Config(this);
        }
        public Builder name(String name) {
            this.name = name;
            return this;
        }

        public Builder age(int age) {
            this.age = age;
            return this;
        }
        public Builder sex(int sex) {
            this.sex = sex;
            return this;
        }
    }

    @Override
    public String toString() {
        return "Config{" +
                "maxTotal=" + maxTotal +
                ", maxIdle=" + maxIdle +
                ", minIdle=" + minIdle +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", sex=" + sex +
                '}';
    }
}
